﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace WebTranslator {
	public class TranslateBase {
		public static int X = 4;
		static List<Tekst> L = new List<Tekst>();
		static string fname = "translate.base";
		static string separator = "->";
		const int ilosctlumaczen = 1;
		public static void start() {
			if (File.Exists(fname) == false) Zapisz();
			Wczytaj();
		}

		static void Zapisz() {
			if (File.Exists(fname)) File.Delete(fname);
			FileStream f = File.OpenWrite(fname);
			Stream sw = f as Stream;
			BinaryFormatter b = new BinaryFormatter();
			b.Serialize(sw, L);
			sw.Close();
		}

		static void Wczytaj() {
			FileStream f = File.OpenRead(fname);
			Stream sw = f as Stream;
			BinaryFormatter b = new BinaryFormatter();
			L = b.Deserialize(f) as List<Tekst>;
			sw.Close();
		}

		public static int DodajTekst(Tekst t) {
			foreach (Tekst x in L) if (t.autor == x.autor && t.nazwa == x.nazwa) return 1;
			L.Add(t);
			Zapisz();
			return 0;
		}

		public static List<string> MojeTeksty(string name) {
			List<string> wyn = new List<string>();
			foreach (Tekst t in L) {
				int w = 0;
				foreach (List<Tlumaczenie> q in t.Tlumaczenia) if (q.Count > 0) w++;
				if (t.autor == name) wyn.Add(t.nazwa + "~" + t.nazwaorginalu + "~" + t.nazwatlumaczenia + "~" + t.Orginal.Count + "~" + w.ToString());
			}
			return wyn;
		}

		public static void usun(string autor, string nazwa) {
			Tekst t = new Tekst(nazwa, autor, "", "", "", "");
			L.Remove(t);
		}

		public static void Translacja(string login, string tresc, string id) {
			Tlumaczenie tl = new Tlumaczenie();
			tl.autor = login;
			tl.tekst = tresc;

			bool c = true;
			string a = "", b = "";
			foreach (char e in id) if (c) { if (e != '.') a += e; else c = false; } else { b += e; }
			int a1 = Int32.Parse(a), a2 = Int32.Parse(b);
			L[a1].Tlumaczenia[a2].Add(tl);
			Zapisz();
		}

		public static void Czysc() {
			L.Clear();
			Zapisz();
		}

		public static void wypisztlumaczenie(int x) {
			int i = 0;
			foreach (string s in L[x].Orginal) {
				Console.WriteLine(s);
				foreach (Tlumaczenie q in L[x].Tlumaczenia[i]) Console.WriteLine(q.tekst + " : " + q.autor);
				i++;
				Console.WriteLine("-");
			}
			Console.WriteLine("----");
		}

		public static bool CzyMozeTlumaczyc(string kto, string czyje, string co) {
			Tekst t = new Tekst(co, czyje, "", "", "", "");
			int x = L.IndexOf(t);
			if (x == -1) return false;
			int i = 0;
			int odl = 0;
			if (L[x].Orginal.Count > X)
				foreach (string s in L[x].Orginal) {
					bool p = true;
					foreach (Tlumaczenie q in L[x].Tlumaczenia[i]) if (q.autor == kto) p = false;
					if (p) odl++; else { odl = 0; }
					if (odl >= X && L[x].Tlumaczenia[i].Count < ilosctlumaczen) return true;
					i++;
				} else {
                
				
                    foreach (List <Tlumaczenie> s in L[x].Tlumaczenia)
					foreach (Tlumaczenie q in s) if (q.autor == kto) return false;
                    int zajete = 0;
                    foreach (var q in L[x].Tlumaczenia) if (q.Count >= ilosctlumaczen) zajete++;
                    if (zajete == L[x].Orginal.Count) return false;

				return true;
			}
			return false;
		}
		public static List<string> CoMogeTlumaczyc(string login) {
			var wyn = new List<string>();
			foreach (Tekst t in L) if (CzyMozeTlumaczyc(login, t.autor, t.nazwa))
					wyn.Add(t.nazwaorginalu + separator + t.nazwatlumaczenia + " " + L.IndexOf(t));
			Console.WriteLine("Listowanie " + wyn.Count.ToString());
			return wyn;
		}

		public static Zadanie DajMiTlumaczenie(string login, string typ) {
			Zadanie z = new Zadanie();
			int x = 0;
			while (CzyMozeTlumaczyc(login, L[x].autor, L[x].nazwa) == false || (L[x].nazwaorginalu + separator + L[x].nazwatlumaczenia != typ)) {
				x++;
				if (x >= L.Count) return null;
			}
			int i = 0;
			int odl = 0;
			int miejsce = -1;
			bool niezerowana = true;
			foreach (string s in L[x].Orginal) {
				bool p = true;
				foreach (Tlumaczenie q in L[x].Tlumaczenia[i]) if (q.autor == login) { p = false; niezerowana = false; }
				if (p) odl++; else { odl = 0; }
				bool naprzod = true;

				for (int j = i + 1; j < Math.Min(i + X - 1, L[x].Tlumaczenia.Count); j++)
					foreach (Tlumaczenie q in L[x].Tlumaczenia[j]) if (q.autor == login) naprzod = false;

				if ((odl >= X || niezerowana) && naprzod && L[x].Tlumaczenia[i].Count < ilosctlumaczen) { miejsce = i; break; }
				i++;
			}
			if (miejsce == -1) return null;
			z.tekst = L[x].Orginal[miejsce];
			z.id = x.ToString() + '.' + miejsce.ToString();
			return z;
		}

		public static List<string> szczegoly(string autro, string nazwa) {
			string a = "", b = "";
			Tekst t = new Tekst(nazwa, autro, "", "", "", "");
			int x = L.IndexOf(t);
			if (x == -1) return null;
			foreach (string s in L[x].Orginal) a += s + "~";
			for (int i = 0; i < L[x].Orginal.Count; i++) { if (L[x].Tlumaczenia[i].Count != 0) b += L[x].Tlumaczenia[i][0].tekst; b += "~"; }
			List<string> wyn = new List<string>();
			Console.WriteLine(a + " " + b);
			wyn.Add(a);
			wyn.Add(b);
			return wyn;
		}
	}

	public class Zadanie {
		public string id;
		public string tekst;
	}
}
